www.gusucode.com > VC++ Windows不规则窗体编程的实例演示-源码程序 > VC++ Windows不规则窗体编程的实例演示-源码程序/code/DlgBmp.cpp

    // DlgBmp.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "Irregular.h"
#include "DlgBmp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgBmp dialog


CDlgBmp::CDlgBmp(CWnd* pParent /*=NULL*/)
	: CDlgBase(CDlgBmp::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgBmp)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CDlgBmp::DoDataExchange(CDataExchange* pDX)
{
	CDlgBase::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgBmp)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgBmp, CDlgBase)
	//{{AFX_MSG_MAP(CDlgBmp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgBmp message handlers

BOOL CDlgBmp::OnInitDialog() 
{
	CDlgBase::OnInitDialog();
	
	// TODO: Add extra initialization here
	CClientDC dc(this);
    SetupRegion(&dc,m_bmp,RGB(0,0,255));
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgBmp::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
    CDC memDC;
    //创建与传入DC兼容的临时DC
    memDC.CreateCompatibleDC(pDC);
    
    CBitmap *pOldMemBmp=NULL;
    //将位图选入临时DC
    pOldMemBmp=memDC.SelectObject(&cBitmap);
    
    CRgn wndRgn;
    //创建总的窗体区域,初始region为0
    wndRgn.CreateRectRgn(0,0,0,0);
    
    
    BITMAP bit;   
    cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽     
    
    int y;
    for(y=0;y<=bit.bmHeight  ;y++)
    {
        CRgn rgnTemp; //保存临时region
        
        int iX = 0;
        do
        {
            //跳过透明色找到下一个非透明色的点.
            while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) == TransColor)
                iX++;
            
            //记住这个起始点
            int iLeftX = iX;
            
            //寻找下个透明色的点
            while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) != TransColor)
                ++iX;
            
            //创建一个包含起点与重点间高为1像素的临时“region”
            rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);
            
            //合并到主"region".
            wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
            
            //删除临时"region",否则下次创建时和出错
            rgnTemp.DeleteObject();
        }while(iX <bit.bmWidth );
        iX = 0;
    }
    
    if(pOldMemBmp)
        memDC.SelectObject(pOldMemBmp);
    
    CWnd * pWnd = pDC->GetWindow();
    pWnd->SetWindowRgn(wndRgn,TRUE);    
    pWnd->SetForegroundWindow();    
        
}